package com.zsk.hw;

/**
 * 骰子有6个面，现在用1，2，3，4，5，6分别代表一个骰子的左，右，前，后，上，下的初始位置，<br>
 * 用R代表向右滚动一次，用L代表向左滚动一次，可以向前翻转（用F表示向前翻转1次），<br>
 * 可以向后翻转（用B表示向后翻转1次），可以逆时针旋转（用A表示逆时针旋转90度），<br>
 * 可以顺时针旋转（用C表示顺时针旋转90度），现从初始状态开始，根据输入的动作序列，计算得到最终的状态。<br>
 * 输入描述：<br>
 * 初始状态为：123456<br>
 * 输入只包含LRFBAC的字母序列，最大长度为50，可重复<br>
 * 输出描述：输出最终状态<br>
 * 输入例子:RA<br>
 * 输出例子：436512<br>
 */
public class TaskTwo {

	/**
	 * 计算筛子状态
	 * 
	 * @param reverse
	 * @return
	 */
	public static String countState(String reverse) {
		int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
		int len = reverse.length();
		for (int i = 0; i < len; i++) {
			roll(data, reverse.substring(i, i + 1));
		}
		StringBuilder sb = new StringBuilder();
		for (int i : data) {
			sb.append(i);
		}
		return sb.toString();
	}

	/**
	 * 滚动筛子
	 * 
	 * @param data
	 * @param r
	 */
	private static void roll(int[] data, String r) {
		switch (r) {
		case "R":
			// R代表向右滚动一次
			swapArray(data, 0, 4);
			swapArray(data, 1, 5);
			swapArray(data, 0, 1);
			break;
		case "L":
			// L代表向左滚动一次
			swapArray(data, 0, 5);
			swapArray(data, 1, 4);
			swapArray(data, 0, 1);
			break;
		case "F":
			// F表示向前翻转1次
			swapArray(data, 2, 5);
			swapArray(data, 3, 4);
			swapArray(data, 2, 3);
			break;
		case "B":
			// B表示向后翻转1次
			swapArray(data, 2, 4);
			swapArray(data, 3, 5);
			swapArray(data, 2, 3);
			break;
		case "A":
			// A表示逆时针旋转90度
			swapArray(data, 0, 2);
			swapArray(data, 1, 3);
			swapArray(data, 0, 1);
			break;
		case "C":
			// C表示顺时针旋转90度
			swapArray(data, 0, 3);
			swapArray(data, 1, 2);
			swapArray(data, 0, 1);
			break;
		}
	}

	private static void swapArray(int[] data, int from, int to) {
		int temp = data[from];
		data[from] = data[to];
		data[to] = temp;
	}

}
